package RMI;

import Modelo.ICliente;
import Modelo.IMensaje;
import Modelo.IServidor;
import Modelo.Mensaje;
import Modelo.Servidor;
import java.net.MalformedURLException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.logging.Level;
import java.util.logging.Logger;

public class SRMI {


    static Registry registro;
    static int RMIPort;
    static String hostName;

    public static Registry iniciarRegistro() throws NotBoundException, MalformedURLException, RemoteException {

        String portNum;

        try {
            portNum = ConfigurationParametersManager.getParameter("DataSource/portNum");
            int RMIPortNum = Integer.parseInt(portNum);
            registro = startRegistry(RMIPortNum);
            return registro;

        } catch (MissingConfigurationParameterException ex) {
            Logger.getLogger(SRMI.class.getName()).log(Level.SEVERE, null, ex);
        }

        return registro;
    }

    // Arranca un registro RMI local si no existiera, en cierto puerto.
    private static Registry startRegistry(int RMIPortNum) throws RemoteException {
        try {
            // crear el registro y ligar el nombre y objeto.
            registro = LocateRegistry.getRegistry(RMIPortNum);
            // Lanza una excepción si no existe el registro
            registro.list();
        } catch (RemoteException e) {
            // No hay un registro válido en el puerto.
            registro = LocateRegistry.createRegistry(RMIPortNum);
            registro.list();
        }
        return registro;
    }

    public static void setMensaje(Registry registro) throws NotBoundException, MalformedURLException, RemoteException {
        IMensaje mensaje = (IMensaje) new Mensaje();
        System.out.println("setMensaje");
        registro.rebind("mensaje", mensaje);
    }

    public static void setServidor(Registry registro) throws NotBoundException, MalformedURLException, RemoteException {
        IServidor servidor = (IServidor) new Servidor();
        System.out.println("setServidor");
        registro.rebind("Servidor", servidor);
    }

    public static ICliente getCliente(ICliente c, int p)  throws MissingConfigurationParameterException,
            NotBoundException,MalformedURLException, RemoteException {

        System.out.println("RMIServidor: getCliente");
        java.security.AllPermission a = new java.security.AllPermission();
        System.setProperty("java.security.policy", "rmi.policy");
        hostName = ClienteManager.getParameter("cliente");
        RMIPort = p;
        registro = LocateRegistry.getRegistry(hostName, p);
        c = (ICliente) registro.lookup("Cliente");

        return c;
    }
}
